//
// Created by pengy on 2024/8/9.
//

#ifndef CMAKE_SAMPLE_SRC_APP_HLP_RADAR_TEST_RADARFILETEST_H_
#define CMAKE_SAMPLE_SRC_APP_HLP_RADAR_TEST_RADARFILETEST_H_

#include <QMap>
#include <QObject>
#include <QThread>

#include <vector>

#include "log/log.h"

#include "AdaptiveFilter.h"

typedef struct LidarData_ {
  int pts;
  int dist;
  int amp;
} LidarData;
typedef std::vector<LidarData> LidarDataS;

class RadarFileTest : public QThread {
 Q_OBJECT

 public:
  RadarFileTest(QThread *parent = nullptr);
  ~RadarFileTest();

  int Start(const QString &filepath);

  // 获取雷达数据
  LidarDataS GetRawData() {
    return raw_data_;
  }
  // 获取有效的雷达数据
  LidarDataS GetValidRawData() {
    valid_lidar_data_.clear();

    LidarData last_valid_data;
    for (int i = 0; i != raw_data_.size(); i++) {
      LidarData item = raw_data_[i];

#define VALID_AMP_MIN 200     // 有效AMP
#define VALID_AMP_MAX 60000   // 有效AMP
      if (VALID_AMP_MIN < item.amp && item.amp < VALID_AMP_MAX) {
        if (item.dist > 400) {   // 超过距离的，都合成固定距离
          item.dist = 400;
        }
        last_valid_data = item;
      } else {
        if (item.dist > 400) {   // 算法-》空闲;固定最远距离
          item.dist = 400;
        } else {                 // 算法-》占用;使用上一次的有效值
          item.dist = last_valid_data.dist;
        }
      }

      valid_lidar_data_.push_back(item);
    }
    return valid_lidar_data_;
  }

  // 获取雷达数据
  LidarDataS GetFilterData(int window) {
    AdaptiveFilter filter(window);

    tri_data_.clear();
    filter_lidar_data_.clear();
    for (int i = 0; i != valid_lidar_data_.size(); i++) {
      LidarData item = valid_lidar_data_[i];
      int dist = item.dist;

      // 滤波
      item.dist = filter.process(item.dist);

      if (filter.CheckIsMotion(item.dist)) {
        tri_data_.push_back(item);
      }

      filter_lidar_data_.push_back(item);
    }
    return filter_lidar_data_;
  }
  // 获取雷达触发点
  LidarDataS GetTriData() {
    return tri_data_;
  }

 protected:
  int ReadRadarData(const QString &filepath);
  void ProcRadarData();

 protected:
  void run() {
  }

 protected:
  LidarDataS raw_data_;           // 雷达原始数据
  LidarDataS valid_lidar_data_;   // 有效雷达数据
  LidarDataS filter_lidar_data_;  // 滤波后雷达数据
  LidarDataS tri_data_;   // 触发点
};

#endif //CMAKE_SAMPLE_SRC_APP_HLP_RADAR_TEST_RADARFILETEST_H_
